C语言高手帮我解决两道题目``小弟愚昧

来源:百度知道 编辑:UC知道 时间:2024/04/29 05:43:18
#include<stdio.h>
#define MIN(x,y) (x)<(y)? (x):(y)
main()
{ int i,j,k;
i=10; j=15;
k=10*MIN(i,j);
printf("%d\n",k);
}
*A) 15 B) 100 C) 10 D)150
下列程序执行后的输出结果是
A) 6 * B) 8 C) 10 D) 12
#define MA(x) x*(x-1)
main()
{ int a=1,b=2; printf("%d \n",MA(1+a+b));}

带*号为正确答案,我只想知道为什么选那个,并且想弄懂这个知识点.请高手指点,详细为我解答下.感激不尽```

这涉及到宏里面的运算优先级的显式表达问题。宏定义的表达式,在编译过程的第一步,预处理时,编译器会对你的代码中所有出现了宏变量(或者宏函数)的地方作文本替换,注意是文本替换。这就相当于编译器在用你给的答案去填空一样。所以,如果你在给出的“答案”中没有用括号显式地标明你希望的运算顺序,那编译器“填空”后,可能就不是你要的运算顺序了。
举一个例子,填空:给定a, b, c三个数,请完成下面的计算式,要求算a与b的和与c的积
___________ * c
本来要填的是(a + b),结果你给编译器的是
#define X a+b
编译器去填空,就成了
a + b * c,完全不是你想要的计算顺序了

一楼的答案是错的
第一题却是就选A,替换没错,分析错了。编译器作了文本替换(注意宏函数的替换包括参数的替换)后确实成了:
k = 10 * (i) < (j) ? (i) : (j);
等号右边整个是一个条件表达式,按照运算优先级,乘号的优先级高于比较运算,所以先算10 * i = 100,然后再和j 做比较,显然小于不成立,所以按照条件表达式的运算规则,整个条件表达式的值是j = 15

第二题楼主就当看了我的讲解后,小试牛刀吧

第一题输出应该是100吧
对于#define定义的宏来讲,要注意表达式中的括号,因为这类宏在编译的时候在编辑器里找到引用该宏的位置直接替换为表达式,因此在编写的时候可能会不小心忽略括号在替换时的影响。
例如第一题
k=10*MIN(i,j)
替换后等价于
k=10*(i)<(j)?(i):(j);
因此输出为k=10*10=100
第二题中由于MA宏没有加括号,因此
printf("%d\n",MA(1+a+b));
被替换成printf("%d\n",1+a+b*(1+a+b-1);
因此输出为8

记住define定义的宏
只起替换作用,不要想别的就行了.

完全同意楼上观点!

.